package com.example.fruitmatching;

import android.util.Log;

import com.example.fruitmatching.data.Fruit;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 游戏用到的算法
 *
 * @author : bugu
 * @date : 2023-04-02 16:44
 */
public class GameAlgorithm {

    private static final String TAG = "Algorithm";
    /**
     * 游戏区域内的水果下标索引：
     * 1. 假设游戏区域内有一个4*4的网格，总元素数量有16个，我们将这16个元素的下标存储在这个列表（gridIndexList）中：
     * {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
     * 2. 每次随机从中抽取两个，为它分配水果图片：
     * 6 ->  R.drawable.selector_fruit_1
     * 9 ->  R.drawable.selector_fruit_2
     * 3. 分配完之后，将这两个下标移除（调用List中的remove方法），此时列表中只剩下了14个下标：
     * {0,1,2,3,4,5,7,8,10,11,12,13,14,15}     //移除了6和9
     * 4. 再次从列表中随机抽取两个下标，分配水果图片，移除....
     * {0,1,2,4,5,7,8,10,11,13,14,15}          //移除了3和12
     * 5. 如此循环下去，直到所有下标都被分配好
     * {}     //列表为空，循环结束
     * 6. 将列表中的一维下标转换成二维坐标
     */
    private List<Integer> gridIndexList;

    /**
     * 随机生成游戏初始界面
     */
    public Fruit[][] initialGameInterface(int rowCount, int columnCount) {
        Fruit[][] result = new Fruit[rowCount][columnCount];

        List<Integer> allFruitImages = new ArrayList<Integer>();
        allFruitImages.add(R.drawable.selector_fruit_1);
        allFruitImages.add(R.drawable.selector_fruit_2);
        allFruitImages.add(R.drawable.selector_fruit_3);
        allFruitImages.add(R.drawable.selector_fruit_4);
        allFruitImages.add(R.drawable.selector_fruit_5);
        allFruitImages.add(R.drawable.selector_fruit_6);
        allFruitImages.add(R.drawable.selector_fruit_7);
        allFruitImages.add(R.drawable.selector_fruit_8);
        allFruitImages.add(R.drawable.selector_fruit_9);
        allFruitImages.add(R.drawable.selector_fruit_10);


        //步骤1：初始化下标列表 gridIndexList
        int totalCount = rowCount * columnCount;
        gridIndexList = new ArrayList<Integer>();
        for (int i = 0; i < totalCount; i++) {
            gridIndexList.add(i);
        }

        //循环体：判断列表中的元素是否为空
        while (!gridIndexList.isEmpty()) {
            Random random = new Random();
            Integer imgId = allFruitImages.get(random.nextInt(allFruitImages.size()));
            Log.d(TAG, "imgId:" + imgId);

            int[] indexes = random2Index();
            int rIndex1 = indexes[0];
            if (rIndex1 == 0) {
                result[0][0] = new Fruit(imgId, 0, 0);
                Log.d(TAG, "一维下标0转换成二维坐标:[0][0]");
            } else {
                int row1 = rIndex1 / rowCount;
                int column1 = rIndex1 % rowCount;
                result[row1][column1] = new Fruit(imgId, row1, column1);
                Log.d(TAG, "一维下标" + rIndex1 + "转换成二维坐标:[" + row1 + "][" + column1 + "]");
            }

            int rIndex2 = indexes[1];
            if (rIndex2 == 0) {
                result[0][0] = new Fruit(imgId, 0, 0);
                Log.d(TAG, "一维下标0转换成二维坐标:[0][0]");
            } else if (rIndex2 == -1) {
                //不需要做任何事
            } else {
                int row2 = rIndex2 / rowCount;
                int column2 = rIndex2 % rowCount;
                result[row2][column2] = new Fruit(imgId, row2, column2);
                Log.d(TAG, "一维下标" + rIndex1 + "转换成二维坐标:[" + row2 + "][" + column2 + "]");
            }
        }

        return result;
    }

    /**
     * 每次返回两个不重复的随机索引
     *
     * @return
     */
    private int[] random2Index() {
        Random rand = new Random();
        int rIndex1 = rand.nextInt(gridIndexList.size());
        int num1 = gridIndexList.get(rIndex1);
        gridIndexList.remove(rIndex1);

        if (gridIndexList.isEmpty()) {
            Log.d(TAG, "由于单元格数量不为偶数，只生成了一个随机一维数组索引:" + num1);
            return new int[]{num1, -1};
        }

        int rIndex2 = rand.nextInt(gridIndexList.size());
        int num2 = gridIndexList.get(rIndex2);
        gridIndexList.remove(rIndex2);

        Log.d(TAG, "生成并删除了随机一维数组索引:" + num1 + "\t" + num2);
        return new int[]{num1, num2};
    }



}
